home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / DIV / M2INIT.M < prev    next >
Encoding:
Text File  |  1995-10-29  |  7.1 KB  |  192 lines

  1. MODULE M2Init;
  2.  
  3. (*
  4.  * Stand: 29.10.95
  5.  *
  6.  * Initialisierungs-Routine für MM2-Programme.
  7.  * Sie ist für normale Programme und Accessories geeignet.
  8.  *
  9.  * Dieses Modul muß in der Regel als erstes Treibermodul beim Linken
  10.  * von MM2-Programmen eingebunden werden. Es wird dann beim Start des
  11.  * Programms angesprungen und erhält in folgenden Registern definierte Werte:
  12.  *  A0: Bei ACCs die Adresse der Base Page, sonst Null.
  13.  *  A1: Zeiger auf eine Liste von Adressen aller Modulkörper.
  14.  *  A2: Zeiger auf den im Prg-code abgelegten PDB (Daten d. residenten Module)
  15.  *
  16.  * Der Stack-Pointer ist bei ACCs noch nicht definiert, zuerst muß ein
  17.  * Speicherbereich alloziert werden, in den dann der Stack gelegt wird.
  18.  *
  19.  * Bei normalen Programmen ist A7 bereits definiert, bei 4(A7) befindet
  20.  * sich der Zeiger auf die Base Page. Das Programm wird immer in den
  21.  * größten freien Speicherbereich geladen, der dann schon alloziert ist.
  22.  * Mit dem 'Mshrink'-Aufruf wird der Bereich soweit verkleinert, daß nur
  23.  * noch der benötigte Platz für den Programmcode, Base Page, glob. Variable
  24.  * und den Stack verbleiben. Der Stack-Pointer, der zuerst auf das Ende des
  25.  * Bereichs zeigt, wird dann ans Ende des neuen, verkleinerten Bereichs
  26.  * gesetzt.
  27.  *
  28.  * Auf die untere Grenze des Stack-Bereichs wird immer das A3-Register
  29.  * gesetzt.
  30.  *
  31.  * Einige Daten im PDB werden für das Laufzeitsystem (z.B. MOSCtrl, PrgCtrl)
  32.  * und die Modulverwaltung (Loader/ModCtrl/ModBase) initialisiert.
  33.  *
  34.  * Dann werden die Module intialisiert, die von M2Init importiert werden.
  35.  * Dazu werden alle Adressen angesprungen, die in der Liste der Modulkörper
  36.  * (A1 zeigt darauf) stehen. Das Ende der Liste ist mit einer Null gekenn-
  37.  * zeichnet. Der Aufruf "PushPDB" schließt die Initialisierung des Laufzeit-
  38.  * systems ab.
  39.  *
  40.  * Nun können die restlichen Modulkörper ausgeführt werden. Deren Adressen
  41.  * folgen in der schon erwähnten Liste. Dabei werden zuerst die weiteren
  42.  * Treibermodule mitsamt ihrer Importe und ganz zuletzt das Hauptmodul
  43.  * gestartet. Wenn es zurückkehrt, ist die Modulkörperliste zuende und
  44.  * das Programm terminiert.
  45.  *
  46.  * ----------------------------------------------------------------------------
  47.  * 18.12.90  Fertigstellung für System 2.2
  48.  * 14.02.91  Der PDB wird nun im BSS- statt im TEXT-Segment angelegt.
  49.  * 17.01.94  Die Pterm-Routine von GEMDOS wird nicht mehr direkt angesprungen.
  50.  * 29.10.95  Auf dem Stack werden 32 Byte Platz gelassen, damit es keine
  51.  *           "Memory Violation" unter MiNT mit aktivem Speicherschutz gibt.
  52.  *)
  53.  
  54. (*$ M-  Keine Symbole ablegen *)
  55. (*$ N+  Runtime-Modul nicht automatisch importieren *)
  56. (*$ L-  Für Assembler: Keine Codeerzeugung vom Compiler am Prozedurbeginn *)
  57.  
  58. FROM SYSTEM IMPORT ASSEMBLER, BYTE, TSIZE;
  59.  
  60. FROM MOSCtrl IMPORT PDB, PushPDB, SetProcessState, ProcessID, Pterm;
  61.  
  62. (* Storage/StorBase darf nicht importiert werden! *)
  63.  
  64. CONST (* default size of stack for process *)
  65.       stackSize = 8192;
  66.  
  67.       (* base page constants *)
  68.       codestart = 8;
  69.       codelen   = 12;
  70.       datastart = 16;
  71.       datalen   = 20;
  72.       bssstart  = 24;
  73.       bsslen    = 28;
  74.       parent    = 36;
  75.       
  76.       (* GEMDOS functions *)
  77.       Malloc  = $48;
  78.       Mshrink = $4A;
  79.  
  80.  
  81. VAR basePDB: PDB;
  82.  
  83. BEGIN
  84.   ASSEMBLER
  85.         MOVE.L  A1,A6             ; A6: address of main module entries
  86.  
  87.         ; first copy preset PDB (A2) to 'basePDB' (A4)
  88.         LEA     basePDB,A4
  89.         MOVEQ   #TSIZE(PDB) DIV 2 - 1,D0
  90. copyPDB MOVE.W  (A2)+,(A4)+
  91.         DBRA    D0,copyPDB
  92.         LEA     basePDB,A4        ; A4 now points to PDB
  93.  
  94.         MOVE.L  A0,D0             ; base page for accessory in A0?
  95.         BNE     initAcc           ; yes
  96.  
  97.         ; initialization for normal programs
  98.         MOVE.L  4(A7),A5
  99.         MOVE.L  codelen(A5),D0
  100.         ADD.L   datalen(A5),D0
  101.         ADD.L   bsslen(A5),D0
  102.         ADDI.L  #256,D0           ; D0: total length of static program space
  103.         MOVE.L  D0,D2
  104.         ADD.L   A5,D2             ; D2: end of program space
  105.         ADDQ.L  #1,D2
  106.         BCLR    #0,D2             ; sync D2
  107.         MOVE.L  D2,A3             ; end of prg.space is bottom of stack
  108.         MOVE.L  PDB.topOfStack(A4),D3
  109.         BEQ     useDefault
  110.         ADD.L   D3,D0
  111.         BRA     gotStack
  112. useDefault:
  113.         ADDI.L  #stackSize,D0
  114. gotStack:
  115.         MOVE.L  D0,D1             ; D0: size of prg.space + stack
  116.         ADD.L   A5,D1             ; D1: top of stack
  117.         ADDQ.L  #1,D1
  118.         BCLR    #0,D1             ; sync D1
  119.         CMP.L   A7,D1             ; enough stack ?
  120.         BHI     oldStack
  121.         MOVE.L  D1,A7             ; set new top of stack
  122. oldStack:
  123.         MOVE.L  D0,-(A7)          ; new workspace of process
  124.         MOVE.L  A5,-(A7)          ; starting address of workspace
  125.         CLR.W   -(A7)
  126.         MOVE    #Mshrink,-(A7)    ; return unused memory
  127.         TRAP    #1
  128.         ADDA.W  #12,A7
  129.         BRA     contNorm
  130.  
  131. initAcc ; initialization for accessories
  132.         MOVE.L  A0,A5             ; address of base page
  133.         LEA     256(A5),A7        ; use top of basepage's cmdline as stack
  134.         MOVE.L  PDB.topOfStack(A4),D0
  135.         BNE     takeIt
  136.         MOVE.L  #stackSize,D0
  137. takeIt: MOVE.L  D0,-(A7)
  138.         MOVE    #Malloc,-(A7)
  139.         TRAP    #1
  140.         ADDQ.L  #2,A7
  141.         MOVE.L  (A7)+,D1          ; size of stack
  142.         TST.L   D0                ; bottom address of stack
  143.         BLE.W   error             ; not enough memory
  144.         MOVE.L  D0,A3             ; bottom of stack -> A3
  145.         ADD.L   D1,D0
  146.         MOVE.L  D0,A7             ; top of stack -> A7
  147.  
  148. contNorm:
  149.         MOVE.L  A5,PDB.basePageAddr(A4)   ; store ^base page
  150.         SUBA.W  #32,A7                    ; TT 29.10.95 added
  151.         MOVE.L  A7,A1                     ; get stack pointer
  152.         SUBA.W  #12,A1                    ; point to process return address,
  153.         MOVE.L  A1,PDB.topOfStack(A4)     ; process needs it to return on error
  154.         MOVE.L  A3,PDB.bottomOfStack(A4)  ; lowest address of stack
  155.         
  156.         ; init modules imported by this module
  157. loop1   MOVE.L  (A6)+,A0
  158.         MOVE.L  A0,D0                     ; end of list ?
  159.         BEQ     end1
  160.         MOVEM.L A4/A6,-(A7)
  161.         JSR     (A0)                      ; call bodies
  162.         MOVEM.L (A7)+,A4/A6
  163.         BRA     loop1
  164.  
  165. end1:   MOVE.L  A4,(A3)+
  166.         MOVE.L  ProcessID,A0
  167.         MOVE.L  (A0),(A3)+
  168.         JSR     PushPDB                   ; determine local process-id
  169.         
  170.         MOVE    #1,(A3)+
  171.         JSR     SetProcessState           ; init-phase
  172. loop2:  MOVE.L  (A6)+,A0
  173.         MOVE.L  A0,D0                     ; end of list ?
  174.         BEQ     end2
  175.         TST.L   (A6)                      ; last module ?
  176.         BNE     notLast
  177.         MOVE.L  A0,-(A7)
  178.         MOVE    #2,(A3)+
  179.         JSR     SetProcessState           ; run-phase
  180.         MOVE.L  (A7)+,A0
  181. notLast MOVEM.L A4/A6,-(A7)
  182.         JSR     (A0)                      ; call main modules
  183.         MOVEM.L (A7)+,A4/A6
  184.         BRA     loop2
  185.  
  186. error:  MOVE    #-39,(A3)+
  187.         BRA     exit
  188. end2:   CLR     (A3)+
  189. exit:   JMP     Pterm                     ; terminate process
  190.   END
  191. END M2Init.
  192.